﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ruandao.MiniAccess.OrMap
{
    /// <summary>
    /// 实体的属性标签类。
    /// </summary>
    /// <remarks>可选属性允许赋null值，但是不允许赋""值。在设置属性时如果提供的值不合法则抛出OrMapException异常。</remarks>
    public class PropertyTag
    {
        /// <summary>
        /// 根据属性和映射类型构造实例。
        /// <br/>OrMapException(指定的属性名称为空串)。
        /// </summary>
        /// <param name="mapType">映射类型,对应的有效标签有&lt;primary-key&gt;,&lt;property&gt;,&lt;many-to-one&gt;,&lt;one-one&gt;。</param>
        /// <param name="name">属性名。注意：可以是私有属性。</param>
        public PropertyTag(ColumnMapType mapType, string name)
        {
            if (string.IsNullOrEmpty(name))
                throw new OrMapException("mdm.xml文件中实体的属性标签（所有entity的子标签）的name属性必须指定，而且不能为空串。");
            this.name = name;
            this.mapType = mapType;
        }

        private ColumnMapType mapType;
        /// <summary>
        /// 映射类型,对应的有效标签有&lt;primary-key&gt;,&lt;property&gt;,&lt;many-to-one&gt;,&lt;one-one&gt;。
        /// </summary>
        public ColumnMapType MapType
        {
            get { return mapType; }
        }

        private string name;
        /// <summary>
        /// "name" Attribute: 实体的属性名称。
        /// </summary>
        public string Name
        {
            get { return name; }
        }

        private string column;
        /// <summary>
        /// "column" Attribute: 字段名称。
        /// <br/>异常：OrMapException(设置属性值为空字符串""，注意设为null不抛出异常，表示使用默认值。)
        /// </summary>
        public string Column
        {
            get { return column; }
            set
            {
                if (value != null && value == "")
                {
                    throw new OrMapException("column属性值非法, xml文件中不能显示指定字段名为空字符串。");
                }
                column = value;
            }
        }

        private string columnType;
        /// <summary>
        /// "column-type" Attribute: 字段类型。
        /// <br/>异常：OrMapException(设置属性值为空字符串""，注意设为null不抛出异常，表示使用默认值。)
        /// </summary>
        public string ColumnType
        {
            get { return columnType; }
            set
            {
                if (value != null && value == "")
                {
                    throw new OrMapException("comumn-type属性值非法, xml文件中不能显式指定字段的类型为空字符串。");
                }
                columnType = value;
            }
        }

        private string update;
        /// <summary>
        /// "update" Attribute: 在更新命令中是否包括该属性的值。
        /// <br/>异常：OrMapException(指定的值不是null、"false"和"true"之一)
        /// </summary>
        public string Update
        {
            get { return update; }
            set
            {
                if (value != null)
                {
                    if (!(value == "true" || value == "false"))
                        throw new OrMapException("update属性值非法, 可选属性，显式的有效值为true或false之一。");
                }
                update = value;
            }
        }

        private string insert;
        /// <summary>
        /// “insert" Attribute: 在插入命令中是否包括该属性的值。
        /// <br/>异常：OrMapException(指定的值不是null、"false"和"true"之一)
        /// </summary>
        public string Insert
        {
            get { return insert; }
            set
            {
                if (value != null)
                {
                    if (!(value == "true" || value == "false"))
                        throw new OrMapException("insert属性值非法, 可选属性，显式的有效值为true或false之一。");
                }
                insert = value;
            }
        }
    }
}
